# -*- codeing = utf-8 -*-
# @Time : 2021/2/25 20:36
# @Atuthor: 朱朱
# @File: 104魔法方法的介绍.py
# @Software: PyCharm
""
"""
# 魔法方法，也叫魔术方法，是类里的特殊的一些方法
# 特点:
# 1.不需要手动调用，会在合适的时机自动调用
# 2. 这些方法，都是使用 __ 开始，使用 __ 结束
# 3. 方法名都是系统规定好的，在合适的时机自己调用
"""
import datetime

# x = datetime.datetime(2020,2,24,16,17,47,200)
# print(x) # __str__ 方法
# print(repr(x)) # __repr__ 方法

class Person(object):
    def __init__(self,name,age):
        # 在创建对象时,会自动调用这个方法
        print('__init__方法被调用了')
        self.name = name
        self.age = age

    def __del__(self):
        # 当对象被销毁时,会自动调用这个方法
        print('__del__ 方法被调用了')

    def __repr__(self):
        """
        __repr__方法和__str__方法功能类似，都是用来修改一个对象的默认打印内容。
        在打印一个对象时，如果没有重写__str__方法，它会自动来查找__repr__方法。
        如果这两个方法都没有，会直接打印这个对象的内存地址。
        :return:
        """
        return 'hello'

    def __str__(self):
        # 返回对象的描述信息
        return f'姓名{self.name},年龄{self.age}'

    def __call__(self, *args, **kwargs):
        # 对象后面加括号,触发执行
        print('__call__ 方法被调用了')
        # args = (1, 2, 4, 5)
        # kwargs = {'m':'good', 'n':'hehehe', 'p':'heiheihei'}
        print(f'args={args},kwargs={kwargs}')



p = Person('jack',66)
print(p)

p(1,2,3,4, m='good',age=22) # 对象名() 调用这个对象的__call__ 方法